// ProjectName: go-learn-demo
// PackageName: reflectybxb
// Description:
// Author: hy.bai
// Date: 2025-08-13, 星期三 21:46

package reflectybxb

import (
	"fmt"
	"reflect"
)

type student struct {
	Name string `json:"name"`
	Age  uint8  `json:"age"`
}

func TestStructReflect() {
	stu := student{
		Name: "hy.bai",
		Age:  18,
	}
	stuValue := reflect.ValueOf(stu) // 获取结构体的值
	fmt.Println(stuValue)            // 打印: {hy.bai 18}
	fmt.Println("结构体属性的个数:", stuValue.NumField())

	// 获取结构体的字段
	field := stuValue.Field(0) // 获取第1个字段的值
	// 获取字段值
	fmt.Println("第1个字段Name的值：", field.String(), "~~~", stuValue.FieldByName("Name").String())
	// 获取字段类型
	fmt.Println("第1个字段Name的类型：", field.Type())
	fmt.Println("---------------------------------")
	stuType := reflect.TypeOf(stu)
	for i := 0; i < stuType.NumField(); i++ {
		// field是一个StructField类型的结构体
		field := stuType.Field(i)
		fmt.Println(field.Name)                       // 属性名字:Name
		fmt.Println(field.Tag, field.Tag.Get("json")) // 属性标签:json:"name"
		fmt.Println(field.Type)                       // 属性类型:string
		fmt.Println(field.Index)                      // 属性索引:[0]
		fmt.Println(field.Anonymous)                  // 属性是否嵌入结构体
		fmt.Println("~~~~~~~~~~~~~~~~~~~~~~")
	}
}
